package mybatis.interfaces;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModelProperty;

import java.io.Serializable;
import java.util.*;

/**
 * 使用 and 连接的 = 操作
 * @author CKC
 */
public interface IFilterQueryCondition extends Serializable {

    /**
     * 等于，相同字段or，不同字段and，eg: filter[type]=user&filter[type]=userGroup&filter[name]=name1 表示 (type = 'userGroup' or type = 'user') and name = 'name1'
     * <p>
     * 备注：为了与SwaggerUI结合，产生Swagger文档
     *
     * @return
     */
    @ApiModelProperty(name = "filter[?]", value = "等于，相同字段or，不同字段and，eg: filter[type]=user&filter[type]=userGroup&filter[name]=name1 表示 (type = 'userGroup' or type = 'user') and name = 'name1' ")
    @JsonIgnore
    default String getFilterSwaggerView() {
        return null;
    }

    /**
     * getFilter
     *
     * @return
     * @see #getFilterSwaggerView()
     */
    Map<String, List<String>> getFilter();


    /**
     * setFilter
     *
     * @param filter
     * @see #getFilterSwaggerView
     */
    void setFilter(Map<String, List<String>> filter);

    /**
     * getFilterByField
     *
     * @param field
     * @return
     */
    @ApiModelProperty(hidden = true)
    @JsonIgnore
    default List<String> getFilter(String field) {
        if (getFilter() != null) {
            return getFilter().get(field);
        } else {
            return null;
        }
    }

    /**
     * addFilter
     *
     * @param field
     * @param values
     * @see #getFilterSwaggerView
     */
    default void addFilter(String field, String... values) {
        if (getFilter() == null) {
            setFilter(new HashMap<>(8));
        }
        if (getFilter().get(field) == null) {
            getFilter().put(field, new ArrayList<>(Arrays.asList(values)));
        } else {
            getFilter().get(field).addAll(Arrays.asList(values));
        }
    }

    /**
     * setFilter(null)
     *
     * @see #getFilterSwaggerView
     */
    default void clearFilter() {
        setFilter(null);
    }

    /**
     * removeByField
     *
     * @param field
     * @see #getFilterSwaggerView
     */
    default void clearTypeFilter(String field) {
        if (getFilter() == null) {
            return;
        }
        getFilter().remove(field);
    }

    /**
     * isEmptyFilter
     *
     * @return
     */
    @ApiModelProperty(hidden = true)
    @JsonIgnore
    default boolean isEmptyFilter() {
        return getFilter() == null || getFilter().isEmpty();
    }

}
